home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2004 #2 / Amiga Plus CD - 2004 - No. 02.iso / AmiSoft / Disk / moni / FileX-src.lha / FileX-src / Grab.c < prev    next >
C/C++ Source or Header  |  1994-09-01  |  4KB  |  210 lines

  1. #include "allprotos.h"
  2. #include "filexstructs.h"
  3. #include "filexstrings.h"
  4.  
  5. static ULONG grabstart, grabend;
  6.  
  7. void GrabMemory( ULONG start, ULONG end, struct DisplayData *DD )
  8. {
  9. /*    if(start>=0xf00000)return;*/
  10. /*    if(end>0xf00000)end=0xf00000;*/
  11.  
  12.     struct FileData *FD;
  13.  
  14.     if(start>end)
  15.     {
  16.         DisplayLocaleText(MSG_INFO_GRAB_ENDBEFORESTART);
  17.         return;
  18.     }
  19.     if(start==end)
  20.     {
  21.         DisplayLocaleText(MSG_INFO_GRAB_STARTEQUALTOEND);
  22.         return;
  23.     }
  24.  
  25.     grabstart = start;
  26.     grabend = end;
  27.  
  28.     FD = DD->FD;
  29.  
  30.     if( ElementZahl( &FD->DisplayList ) == 1 )
  31.         FreeFD( FD );
  32.     else
  33.         Remove( &DD->FNode );
  34.  
  35.     FD = AllocFD( FD_GRAB );
  36.     AddTail( &FD->DisplayList, &DD->FNode );
  37.     DD->FD = FD;
  38.  
  39.     FD->Len = FD->RLen = end - start;
  40.     FD->Mem = ( UBYTE * )start;
  41.  
  42.     if( DD->DI->Wnd )
  43.     {
  44.         CursorOff( DD );
  45.         DD->SPos = 0;
  46.         DD->CPos = 0;
  47.         UpdateStatusZeile( DD );
  48.         SetScrollerGadget( DD );
  49.         RedrawDisplay( DD );
  50.         CursorOn( DD );
  51.     }
  52. }
  53.  
  54. /*
  55.  * int DoGrabWindow(void)
  56.  *
  57.  * GrabWindowAbfrage. Gibt zurück, wie Window verlassen wurde
  58.  *                                   (Cancel=FALSE/Okay=TRUE)
  59.  */
  60.  
  61. enum {
  62. GD_GRAB_START,
  63. GD_GRAB_END,
  64. GD_GRAB_GRAB,
  65. GD_GRAB_CANCEL
  66. };
  67.  
  68. struct MyNewGadget GrabNewGadgets[] =
  69. {
  70.     HEX_KIND, 0, 0, 0, MSG_GADGET_GRAB_START, 0, 8, 0, 9, 0,
  71.     HEX_KIND, 0, 0, 0, MSG_GADGET_GRAB_END, 0, 8, 0, 9, 0,
  72.  
  73.     BUTTON_KIND, GP_LEFTBOTTOM, 0, 0, MSG_GADGET_OK, 0, 0, 0, 0, 0,
  74.     BUTTON_KIND, GP_RIGHTBOTTOM, 0, 0, MSG_GADGET_CANCEL, 0, 0, 0, 0, 0,
  75.     0
  76. };
  77.  
  78. static struct WindowData GrabWD =
  79. {
  80.     NULL,    NULL,    FALSE, NULL, NULL,
  81.     0,0,
  82.     &GrabNewGadgets[ 0 ], 4
  83. };
  84.  
  85. static void DoGrabWndMsg(void)
  86. {
  87.     struct IntuiMessage    *m, Msg;
  88.     struct Gadget *gad;
  89.  
  90.     WORD wie = -1;        /* Wie wurde Window verlassen ? */
  91.  
  92.     while( m = GT_GetIMsg( GrabWD.Wnd->UserPort ))
  93.     {
  94.         CopyMem(( char * )m, ( char * )&Msg, (long)sizeof( struct IntuiMessage ));
  95.  
  96.         GT_ReplyIMsg( m );
  97.  
  98.         KeySelect( GrabWD.Gadgets, &Msg);
  99.  
  100.         gad=(struct Gadget *)Msg.IAddress;
  101.  
  102.         switch ( Msg.Class )
  103.         {
  104.             case    IDCMP_REFRESHWINDOW:
  105.                 GT_BeginRefresh( GrabWD.Wnd );
  106.                 GT_EndRefresh( GrabWD.Wnd, TRUE );
  107.                 break;
  108.  
  109.             case    IDCMP_VANILLAKEY:
  110.                 if( Msg.Code == 13)
  111.                 {
  112.                     wie = 1;
  113.                 }
  114.                 break;
  115.  
  116.             case    IDCMP_CLOSEWINDOW:
  117.                 wie = 0;
  118.                 break;
  119.  
  120.             case    IDCMP_GADGETUP:
  121.                 switch(gad->GadgetID)
  122.                 {
  123.                     case GD_GRAB_GRAB:
  124.                         wie = 1;
  125.                         break;
  126.  
  127.                     case GD_GRAB_CANCEL:
  128.                         wie = 0;
  129.                         break;
  130.  
  131.                     case GD_GRAB_START:
  132.                         if(!IsHexString(GetString(GrabWD.Gadgets[GD_GRAB_START])))
  133.                         {
  134.                             MyRequest( MSG_INFO_GLOBAL_ILLEGALCHARACTERS, ( ULONG )GetString( GrabWD.Gadgets[ GD_GRAB_START ]));
  135.                             ActivateGadget(GrabWD.Gadgets[GD_GRAB_START],GrabWD.Wnd,0);
  136.                         }
  137.                         else
  138.                             ActivateGadget(GrabWD.Gadgets[GD_GRAB_END],GrabWD.Wnd,0);
  139.                         break;
  140.  
  141.                     case GD_GRAB_END:
  142.                         if(!IsHexString(GetString(GrabWD.Gadgets[GD_GRAB_END])))
  143.                         {
  144.                             MyRequest( MSG_INFO_GLOBAL_ILLEGALCHARACTERS, ( ULONG )GetString( GrabWD.Gadgets[ GD_GRAB_END ]));
  145.                             ActivateGadget(GrabWD.Gadgets[GD_GRAB_END],GrabWD.Wnd,0);
  146.                         }
  147.                         break;
  148.                 }
  149.                 break;
  150.         }
  151.     }
  152.  
  153.     if( wie == 1 )
  154.     {
  155.         ULONG start, end;
  156.  
  157.         stch_l( GetString( GrabWD.Gadgets[ GD_GRAB_START ] ), (LONG *)&start);
  158.         stch_l( GetString( GrabWD.Gadgets[ GD_GRAB_END ] ), (LONG *)&end);
  159.  
  160.         GrabMemory( start, end, AktuDD );
  161.     }
  162.  
  163.     if( wie != -1 )
  164.     {
  165.         MyRemoveSignal( 1L << GrabWD.Wnd->UserPort->mp_SigBit );
  166.         NewCloseAWindow( &GrabWD );
  167.     }
  168. }
  169.  
  170. void OpenGrabWindow( void )
  171. {
  172.     long err;
  173.     UBYTE GrabStartString[9], GrabEndString[9];
  174.  
  175.     if( GrabWD.Wnd )
  176.     {
  177.         ActivateWindow( GrabWD.Wnd );
  178.         return;
  179.     }
  180.  
  181.     if( AktuDD->FD->Typ == FD_GRAB )
  182.     {
  183.         grabstart = ( ULONG )AktuDD->FD->Mem;
  184.         grabend = ( ULONG )AktuDD->FD->Mem + AktuDD->FD->Len;
  185.     }
  186.  
  187.     if((grabstart==0)&&(grabend==0))
  188.     {
  189.         GrabNewGadgets[GD_GRAB_START].CurrentValue = 
  190.         GrabNewGadgets[GD_GRAB_END  ].CurrentValue = 0;
  191.     }
  192.     else
  193.     {
  194.         GrabNewGadgets[GD_GRAB_START].CurrentValue = (LONG) GrabStartString;
  195.         GrabNewGadgets[GD_GRAB_END  ].CurrentValue = (LONG) GrabEndString;
  196.  
  197.         sprintf(GrabStartString, "%08.lx", grabstart);
  198.         sprintf(GrabEndString, "%08.lx", grabend);
  199.     }
  200.  
  201.     if( err = NewOpenAWindow( &GrabWD, GetStr( MSG_WINDOWTITLE_GRAB )))
  202.         MyRequest( MSG_INFO_GLOBAL_CANTOPENWINDOW, err);
  203.     else
  204.     {
  205.         ActivateGadget( GrabWD.Gadgets[ GD_GRAB_START ], GrabWD.Wnd, 0);
  206.  
  207.         MyAddSignal( 1L << GrabWD.Wnd->UserPort->mp_SigBit, &DoGrabWndMsg );
  208.     }
  209. }
  210.